iT邦幫忙

2021 iThome 鐵人賽

DAY 26
0

這篇羅列導入 DDD 時遇到的困難,以及針對這些問題,在團隊內還沒有確切設計共識時,我們的處理方式。

Ransack

Ransack 依賴 ActiveRecord,導致不依賴 ActiveRecord 的 Boxenn 沒辦法使用。然而,專案中有不少地方使用到 Ransack 方便的 SQL 查詢功能,沒辦法輕易捨棄。

目前的解法是 controller 接到參數後,先利用 model.ransack 拿到 ActiveRecord::Relation,再將其透過 factoryrepository 拿到 entity,另一種處理方式則是有 Ransack 的地方就不再透過 Boxenn 而是 ActiveRecord 拿到物件。

Form Object

原本我們是用 Rails 的 model 直接透過 simple form 產生前端表格,然而很多時候 model 的欄位其實跟網頁中想要呈現的表格有落差,例如表格不想要出現某些欄位、某些 model 需要合併起來當一個表格填寫等等。

目前的解法是先在 controller 透過 OpenStruct 建立一個物件丟給 simple form 後產生前端表格,但中文化就得要手動調整,不能透過 rails 的 I18n 自動處理。

# controller.rb
class UserController < ApplicationController
  def new
	@user = OpenStruct.new(
	  name: nil,
	  id_number: nil,
	  gender: nil,
    )
  end

  def create
    # 將傳入的 params 做處理
  end
end
# new.slim
= simple_form_for @user, as: :user, url: new_user_path, method: :post do |f|
  = render partial: 'form', object: f, as: :f

# _form.slim
= f.input :name, label: '名稱'
= f.input :id_number, label: '身分證字號'
= f.input :gender, label: '性別', as: :select, collection: [['男', :male], ['女', :female], ['其他', :other]], input_html: { 'data-select': true }
= f.submit '確定',  class: 'btn btn-success'
= button_to '取消', homepage_path, class: 'btn-muted'

下一篇會來說說除了實作外,我們在開發流程中做的變化。


上一篇
[DAY25] Boxenn 小結
下一篇
[DAY27] 功能型團隊 VS 需求型團隊
系列文
在 Ruby on Rails 中導入 Domain-Driven Design 是不是搞錯了什麼?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言